﻿/*
 Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
 For licensing, see LICENSE.html or http://ckeditor.com/license
 */

/**
 * @fileOverview The "placeholder" plugin.
 *
 */

(function () {
    var placeholderReplaceRegex = /\[\[[^\]]+\]\]/g;
    CKEDITOR.plugins.add('placeholder',
        {
            requires: ['dialog'],
            lang: ['bg', 'cs', 'cy', 'da', 'de', 'el', 'en', 'eo', 'et', 'fa', 'fi', 'fr', 'he', 'hr', 'it', 'nb', 'nl', 'no', 'pl', 'pt-br', 'tr', 'ug', 'uk', 'vi', 'zh-cn'],
            init: function (editor) {
                var lang = editor.lang.placeholder;

                editor.addCommand('createplaceholder', new CKEDITOR.dialogCommand('createplaceholder'));
                editor.addCommand('editplaceholder', new CKEDITOR.dialogCommand('editplaceholder'));

                editor.ui.addButton('CreatePlaceholder',
                    {
                        label: lang.toolbar,
                        command: 'createplaceholder',
                        icon: this.path + 'placeholder.gif'
                    });

                if (editor.addMenuItems) {
                    editor.addMenuGroup('placeholder', 20);
                    editor.addMenuItems(
                        {
                            editplaceholder: {
                                label: lang.edit,
                                command: 'editplaceholder',
                                group: 'placeholder',
                                order: 1,
                                icon: this.path + 'placeholder.gif'
                            }
                        });

                    if (editor.contextMenu) {
                        editor.contextMenu.addListener(function (element, selection) {
                            if (!element || !element.data('cke-placeholder'))
                                return null;

                            return {editplaceholder: CKEDITOR.TRISTATE_OFF};
                        });
                    }
                }

                editor.on('doubleclick', function (evt) {
                    if (CKEDITOR.plugins.placeholder.getSelectedPlaceHoder(editor))
                        evt.data.dialog = 'editplaceholder';
                });

                editor.addCss(
                    '.cke_placeholder' +
                    '{' +
                    'background-color: #ffff00;' +
                    ( CKEDITOR.env.gecko ? 'cursor: default;' : '' ) +
                    '}'
                );

                editor.on('contentDom', function () {
                    editor.document.getBody().on('resizestart', function (evt) {
                        if (editor.getSelection().getSelectedElement().data('cke-placeholder'))
                            evt.data.preventDefault();
                    });
                });

                CKEDITOR.dialog.add('createplaceholder', this.path + 'dialogs/placeholder.js');
                CKEDITOR.dialog.add('editplaceholder', this.path + 'dialogs/placeholder.js');
            },
            afterInit: function (editor) {
                var dataProcessor = editor.dataProcessor,
                    dataFilter = dataProcessor && dataProcessor.dataFilter,
                    htmlFilter = dataProcessor && dataProcessor.htmlFilter;

                if (dataFilter) {
                    dataFilter.addRules(
                        {
                            text: function (text) {
                                return text.replace(placeholderReplaceRegex, function (match) {
                                    return CKEDITOR.plugins.placeholder.createPlaceholder(editor, null, match, 1);
                                });
                            }
                        });
                }

                if (htmlFilter) {
                    htmlFilter.addRules(
                        {
                            elements: {
                                'span': function (element) {
                                    if (element.attributes && element.attributes['data-cke-placeholder'])
                                        delete element.name;
                                }
                            }
                        });
                }
            }
        });
})();

CKEDITOR.plugins.placeholder =
{
    createPlaceholder: function (editor, oldElement, text, isGet) {
        var element = new CKEDITOR.dom.element('span', editor.document);
        element.setAttributes(
            {
                contentEditable: 'false',
                'data-cke-placeholder': 1,
                'class': 'cke_placeholder'
            }
        );

        text && element.setText(text);

        if (isGet)
            return element.getOuterHtml();

        if (oldElement) {
            if (CKEDITOR.env.ie) {
                element.insertAfter(oldElement);
                // Some time is required for IE before the element is removed.
                setTimeout(function () {
                    oldElement.remove();
                    element.focus();
                }, 10);
            }
            else
                element.replace(oldElement);
        }
        else
            editor.insertElement(element);

        return null;
    },

    getSelectedPlaceHoder: function (editor) {
        var range = editor.getSelection().getRanges()[0];
        range.shrink(CKEDITOR.SHRINK_TEXT);
        var node = range.startContainer;
        while (node && !( node.type == CKEDITOR.NODE_ELEMENT && node.data('cke-placeholder') ))
            node = node.getParent();
        return node;
    }
};
